import { defineStore } from 'pinia'
import { commonApi } from '@/api'

/**
 * 通用状态管理store
 */
export const useCommonStore = defineStore('common', {
  state: () => ({
    // 字典数据缓存
    dictionaries: {},
    // 学期列表
    semesters: [],
    // 当前学期
    currentSemester: null,
    // 系统公告
    notices: []
  }),
  
  getters: {
    /**
     * 获取指定类型的字典数据
     * @param {string} dictType - 字典类型
     * @returns {Array} - 字典数据数组
     */
    getDictByType: (state) => (dictType) => {
      return state.dictionaries[dictType] || []
    },
    
    /**
     * 获取当前学期信息
     * @returns {Object|null} - 当前学期信息
     */
    getCurrentSemesterInfo: (state) => {
      if (!state.currentSemester || !state.semesters.length) return null
      return state.semesters.find(item => item.value === state.currentSemester) || null
    }
  },
  
  actions: {
    /**
     * 获取字典数据
     * @param {string} dictType - 字典类型
     * @returns {Promise<Array>} - 字典数据数组
     */
    async fetchDictData(dictType) {
      // 如果已缓存，直接返回
      if (this.dictionaries[dictType]) return this.dictionaries[dictType]
      
      try {
        const res = await commonApi.getDictData(dictType)
        if (res.code === 200 && res.data) {
          // 缓存字典数据
          this.dictionaries[dictType] = res.data
          return res.data
        }
        return []
      } catch (error) {
        console.error(`获取字典数据(${dictType})失败:`, error)
        return []
      }
    },
    
    /**
     * 获取学期列表
     * @returns {Promise<Array>} - 学期列表
     */
    async fetchSemesters() {
      try {
        const res = await commonApi.getSemesters()
        if (res.code === 200 && res.data) {
          this.semesters = res.data
          return res.data
        }
        return []
      } catch (error) {
        console.error('获取学期列表失败:', error)
        return []
      }
    },
    
    /**
     * 获取当前学期
     * @returns {Promise<string|null>} - 当前学期值
     */
    async fetchCurrentSemester() {
      try {
        const res = await commonApi.getCurrentSemester()
        if (res.code === 200 && res.data) {
          this.currentSemester = res.data.value
          return res.data.value
        }
        return null
      } catch (error) {
        console.error('获取当前学期失败:', error)
        return null
      }
    },
    
    /**
     * 获取系统公告
     * @param {Object} params - 查询参数
     * @returns {Promise<Array>} - 公告列表
     */
    async fetchNotices(params = {}) {
      try {
        const res = await commonApi.getNotices(params)
        if (res.code === 200 && res.data) {
          this.notices = res.data
          return res.data
        }
        return []
      } catch (error) {
        console.error('获取系统公告失败:', error)
        return []
      }
    },
    
    /**
     * 初始化通用数据
     * 可在应用启动时调用，一次性加载常用数据
     */
    async initCommonData() {
      await Promise.all([
        this.fetchSemesters(),
        this.fetchCurrentSemester(),
        this.fetchNotices()
      ])
    }
  }
}) 